home *** CD-ROM | disk | FTP | other *** search
/ 3D Games - Real-time Rend…ng & Software Technology / 3D Games - Real-time Rendering & Software Technology.iso / flysdk / plugin / observer / observer.cpp next >
Encoding:
C/C++ Source or Header  |  2000-06-26  |  4.0 KB  |  228 lines

  1. #include "..\..\lib\Fly3D.h"
  2. #include "observer.h"
  3.  
  4. observer_desc cd_observer;
  5.  
  6. BOOL APIENTRY DllMain(HINSTANCE hModule, 
  7.                       DWORD  ul_reason_for_call, 
  8.                       LPVOID lpReserved)
  9. {    
  10.     switch( ul_reason_for_call ) 
  11.     {
  12.     case DLL_PROCESS_ATTACH:
  13.     case DLL_THREAD_ATTACH:
  14.     case DLL_THREAD_DETACH:
  15.     case DLL_PROCESS_DETACH:
  16.         break;
  17.     }
  18.     return TRUE;
  19. }
  20.  
  21. __declspec( dllexport )
  22. int num_classes()
  23. {
  24.     return 1;
  25. }
  26.  
  27. __declspec( dllexport )
  28. class_desc *get_class_desc(int i)
  29. {
  30.     switch(i)
  31.     {
  32.     case 0:
  33.         return &cd_observer;
  34.     default: return 0;
  35.     }
  36. }
  37.  
  38. __declspec( dllexport )
  39. int fly_message(int msg,int param,void *data)
  40. {
  41.     switch(msg)
  42.     {
  43.     case FLYM_UPDATESCENE:
  44.         // step plugin (dt in param)
  45.         break;
  46.     case FLYM_DRAWSCENE:
  47.         flyengine->set_camera(flyengine->cam);
  48.         flyengine->draw_bsp();
  49.         break;
  50.     case FLYM_DRAWTEXT:
  51.         {
  52.         static DWORD t=timeGetTime();
  53.         static int frame_rate=0,frame_count=0;
  54.         static char str[256];
  55.         frame_count++;
  56.         if (flyengine->cur_time-t>1000)
  57.             {
  58.             frame_rate=frame_count*1000/(flyengine->cur_time-t);
  59.             t=flyengine->cur_time;
  60.             frame_count=0;
  61.             }
  62.         if (flyengine->cur_time - flyengine->status_msg_time > 2000)
  63.             {
  64.             sprintf(str,"FPS:%i N:%i",frame_rate,flyengine->nodedrawcount);
  65.             flyengine->draw_text( screen_sx-96, 0, str );
  66.             }
  67.         }
  68.         break;
  69.     case FLYM_INITSCENE:
  70.         // draw 2d plugin
  71.         break;
  72.     case FLYM_CLOSESCENE:
  73.         // draw 2d plugin
  74.         break;
  75.     }
  76.     return 1;
  77. }
  78.  
  79. void observer::init()
  80. {
  81.     if (flyengine->get_random_point(pos,10)==0)
  82.         pos.null();
  83. }
  84.  
  85. int observer::step(int dt)
  86. {
  87.     if (node==0)
  88.         add_to_bsp();
  89.  
  90.     check_keys(dt);
  91.  
  92.     float len=vel.length();
  93.     if (len<0.01f)
  94.         vel.null();
  95.     else
  96.     {
  97.         vel/=len;
  98.         len-=dt*veldamp;
  99.         if (len>maxvel)
  100.             len=maxvel;
  101.         if (len<0.0f)
  102.             len=0.0f;
  103.         vel*=len;
  104.     }
  105.  
  106.     life=dt;
  107.     return particle::step(dt);
  108. }
  109.  
  110.  
  111. void observer::check_keys(int dt)
  112. {
  113.     unsigned char *diks=directx->diks;
  114.  
  115.     static int lastmouse[2][2]={ { 0,0 },{ 0,0 } },lm=0;
  116.     float mousedx=(directx->dims.lX+lastmouse[0][0]+lastmouse[1][0])/3.0f;
  117.     float mousedy=(directx->dims.lY+lastmouse[0][1]+lastmouse[1][1])/3.0f;
  118.     lastmouse[lm][0]=directx->dims.lX;
  119.     lastmouse[lm][1]=directx->dims.lY;
  120.     lm=!lm;
  121.     
  122.     if (diks[0x38])    // ALT key
  123.         {
  124.         if (diks[0xcb])        // left arrow
  125.             vel-=X*(moveforce*dt);
  126.  
  127.         if (diks[0xcd])        // right arrow
  128.             vel+=X*(moveforce*dt);
  129.  
  130.         if (diks[0xc8])        // up arrow
  131.             vel+=Y*(moveforce*dt);
  132.  
  133.         if (diks[0xd0])        // down arrow
  134.             vel-=Y*(moveforce*dt);
  135.  
  136.         if (diks[0x1f])        // S key
  137.             vel-=Z*(moveforce*dt);
  138.  
  139.         if (diks[0x2d])        // X key
  140.             vel+=Z*(moveforce*dt);
  141.         }
  142.     else
  143.         {
  144.         if (diks[0xc8])    // up arrow
  145.             rotate(-dt*rotvel,X);
  146.         
  147.         if (diks[0xd0])    // down arrow
  148.             rotate(dt*rotvel,X);
  149.  
  150.         if (diks[0xcb])    // left arrow
  151.             rotate(dt*rotvel,Y);
  152.  
  153.         if (diks[0xcd])    // right arrow
  154.             rotate(-dt*rotvel,Y);
  155.  
  156.         if (diks[0x10])    // Q key
  157.             vel-=X*(moveforce*dt);
  158.  
  159.         if (diks[0x12])    // E key
  160.             vel+=X*(moveforce*dt);
  161.  
  162.         if (diks[0x1f])    // S key
  163.             vel-=Z*(moveforce*dt);
  164.  
  165.         if (diks[0x2d])    // X key
  166.             vel+=Z*(moveforce*dt);
  167.         }
  168.  
  169.     if (diks[0x1e])        // A key
  170.         rotate(dt*rotvel,Z);
  171.     if (diks[0x20])        // D key
  172.         rotate(-dt*rotvel,Z);
  173.  
  174.     if (mousedx)    // mouse X
  175.         rotate(-mousedx*mousevel,Y);
  176.  
  177.     if (mousedy)    // mouse Y
  178.         rotate(mousedy*mousevel,X);
  179. }
  180.  
  181. void observer::draw()
  182. {
  183. }
  184.  
  185. bsp_object *observer::clone()
  186. {
  187.     observer *tmp=new observer;
  188.     *tmp=*this;
  189.     tmp->source=this;
  190.     return tmp;
  191. }
  192.  
  193. int observer::get_custom_param_desc(int i,param_desc *pd)
  194. {
  195.     if (pd!=0)
  196.     switch(i)
  197.     {
  198.     case 0:
  199.         pd->type='f';
  200.         pd->data=&rotvel;
  201.         strcpy(pd->name,"rotvel");
  202.         break;
  203.     case 1:
  204.         pd->type='f';
  205.         pd->data=&mousevel;
  206.         strcpy(pd->name,"mousevel");
  207.         break;
  208.     case 2:
  209.         pd->type='f';
  210.         pd->data=&moveforce;
  211.         strcpy(pd->name,"moveforce");
  212.         break;
  213.     case 3:
  214.         pd->type='f';
  215.         pd->data=&maxvel;
  216.         strcpy(pd->name,"maxvel");
  217.         break;
  218.     case 4:
  219.         pd->type='f';
  220.         pd->data=&veldamp;
  221.         strcpy(pd->name,"veldamp");
  222.         break;
  223.     }
  224.     return 5;
  225. }
  226.  
  227.  
  228.